import axios from "axios";
import { Message } from 'element-ui';
import router from '@/router/index.js';
import NProgress from 'nprogress'

const instance = axios.create({
    //baseURL将会自动加到get,post,put,delete请求路径前
    baseURL: 'http://localhost/api/',
    // 超时时间
    timeout: 10000
});

// 全局请求拦截：所有的请求先走这个
instance.interceptors.request.use(config => {
    NProgress.start();
    // 将token放在headers中的Authorization
    const token = sessionStorage.getItem("USER-TOKEN");
    token && (config.headers.token = token);
    return config;
}, error => {
    return Promise.reject(error);
});

// 全局响应拦截，在回调函数（then）前执行，可以根据响应不同的状态码跳转到不同的页面
instance.interceptors.response.use(resp => {
        NProgress.done();
        //接收到响应数据并成功后的一些共有的处理，关闭loading等
        return resp;
    },
    error => {
        /***** 接收到异常响应的处理开始 *****/
        if (error && error.response) {
            // 1.公共错误处理
            // 2.根据响应码具体处理
            switch (error.response.status) {
                case 400:
                    error.message = '错误请求'
                    break;
                case 401:
                    error.message = '未授权，请先登录'
                    console.log('未授权，请先登录');
                    router.push('/login')
                    break;
                case 403:
                    error.message = '拒绝访问'
                    break;
                case 404:
                    error.message = '请求错误,未找到该资源'
                    break;
                case 405:
                    error.message = '请求方法未允许'
                    break;
                case 408:
                    error.message = '请求超时'
                    break;
                case 500:
                    error.message = '服务器端出错'
                    break;
                case 501:
                    error.message = '网络未实现'
                    break;
                case 502:
                    error.message = '网络错误'
                    break;
                case 503:
                    error.message = '服务不可用'
                    break;
                case 504:
                    error.message = '网络超时'
                    break;
                case 505:
                    error.message = 'http版本不支持该请求'
                    break;
                default:
                    error.message = `连接错误${error.response.status}`
            }
        } else {
            // 超时处理
            if (JSON.stringify(error).includes('timeout')) {
                Message.error('服务器响应超时，请刷新当前页')
            }
            error.message('连接服务器失败')
        }
        Message.error(error.message)
            /***** 处理结束 *****/
            //如果不需要错误处理，以上的处理过程都可省略
        return Promise.resolve(error.response)
    })

// 导出axios实例  instance
export default instance;